<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Window对象</title>
    <script>
        /* 
            Window对象
                在浏览器中，浏览器为我们提供了一个window对象，可以直接访问。（无需创建的window对象）

                window对象代表的是浏览器窗口。通过该对象可以对浏览器窗口进行各种操作。

                除此之外，windows对象还负责存储JS中的内置对象和浏览器中的宿主对象。

                window对象的属性可以通过window对象访问，也可以直接访问，所以函数可以认为是window对象的方法。
        
        

        JS的内置对象
            比如
                Number()函数
                String()函数等

        浏览器的宿主对象
            比如
                alert()
                document.write()
                console.log()

        它们都存储在window对象中
        */
        console.log(window)   // 浏览器提供的无需创建的window对象

        window.console.log('通过window对象访问')
        console.log('直接访问')

        console.log('=============================1==============================')
        
        for (i in window){
            console.log(i,':',window[i])
        }

        //  在window对象中添加的属性会自动称为全局变量
        window.a=10     // 在window对象中添加一个属性a，值为10
        console.log(a)
        console.log(window['a'])


        console.log('==========================2=================================')

        // var声明变量，作用和let很像，但是var没有块作用域,但是有函数作用域，也就是通过var和let在函数中定义的变量，都不能在函数外访问。
        var b=20    // 使用var声明的变量都会作为window对象的属性保存，这里就相当于window.b=20
        console.log(b)
        console.log(window['b'])
        console.log('=============================3==============================')

        let c=20
        console.log(c)

        console.log(window.c)       // undefined ，使用let声明的变量不能作为全局变量，因为存在作用域
        console.log(window['c'])    



        console.log('===============================4============================')

        //使用function 声明的函数都会作为window的对象保存
        function fn(){
            console.log('使用function声明的函数')
            let d=10    //函数中通过let 和var声明的变量都存在函数作用域，在外部访问，都是undefined.
            var e=20
            f=30        // 直接定义的变量，则自动生成为window对象的属性，也就是全局变量。在函数外部可以访问。
        }

        console.log(d)    // d is not defined
        console.log(e)      // e is not defined

        console.log(f)      // 30
        
        fn()            //函数直接调用
        window.fn       // window的fn方法

        window.fn()     // window的fn方法使用



    </script>
</head>
<body>
    
</body>
</html>